package model;
import java.util.Observable;
import java.util.Observer;

/**
 * @author Administrador
 *
 */
public class Fantasma extends Movible implements Observer {

    private EstadoFantasma estadoFantasma;
    private ElemEscenario posicionGuarida;
    private Vivacidad vivacidad;

    public EstadoFantasma getEstadoFantasma() {
        return estadoFantasma;
    }

    public void setEstadoFantasma(EstadoFantasma estadoFantasma) {
        this.estadoFantasma = estadoFantasma;
    }

    public Fantasma(ElemEscenario posicionGuarida, Vivacidad vivacidad) {
        setEstadoFantasma(new CazadorNormal());
        setPosicionGuarida(posicionGuarida);
        setPosicion(posicionGuarida);
        setVivacidad(vivacidad);
        setTurnoIncioMovimiento(Constantes.TURNO_INICIAL);
    }

    //Solo para test!
    public Fantasma(EstadoFantasma estadoFantasma) {
        setEstadoFantasma(estadoFantasma);
    }

    public boolean morir() {
        boolean morir = estadoFantasma.morir(this);
        if (morir) {
            setPosicion(getPosicionGuarida());
        }
        return morir;
    }

    public int getCasillerosParaPersecucion() {
        return vivacidad.getCasillerosParaPersecucion();
    }

    public ElemEscenario getUltimaPosicionVistoPacman() {
        return vivacidad.getUltimaPoscicionVisto();
    }

    public void setUltimaPosicionVistoPacman(ElemEscenario elemEscenario){
        vivacidad.setUltimaPoscicionVisto(elemEscenario);
    }

    @Override
    public int getVelocidad() {
        return estadoFantasma.getVelocidad();  //To change body of implemented methods use File | Settings | File Templates.
    }

    public boolean mover(ElemEscenario elemEscenario) {
        boolean mover = estadoFantasma.mover(this);
        if (mover) {
            if (getPosicion() != null) {
                setPosicionAnterior(getPosicion());
            } else {
                setPosicionAnterior(getPosicionGuarida());
            }
            setPosicion(elemEscenario);
        }
        return mover;
    }

    public boolean comer() {
        return estadoFantasma.comer(this);
    }

    public boolean molestar() {
        return estadoFantasma.molestar(this);
    }

    public String mostrarEstado() {
        return estadoFantasma.mostrarEstado(this);
    }

    public boolean reiniciarEstado() {
        return estadoFantasma.reiniciarEstado(this);
    }

    public boolean convertirEnPresa() {
        return estadoFantasma.convertirEnPresa(this);
    }

    public boolean volverAestadoAnterior() {
        return estadoFantasma.volverAestadoAnterior(this);
    }

    public ElemEscenario getPosicionGuarida() {
        return posicionGuarida;
    }

    public void setPosicionGuarida(ElemEscenario posicionGuarida) {
        this.posicionGuarida = posicionGuarida;
    }

    public String mostrarVivacidad(){
        return vivacidad.mostrarVivacidad();
    }

    public void setVivacidad(Vivacidad vivacidad) {
        this.vivacidad = vivacidad;
    }

    public boolean estuveEnEstadoDeCaza() {
        return vivacidad.isEstuveEnRangoDeCaza();
    }

    public void setEstuveEnEstadoDeCaza(boolean b) {
        vivacidad.setEstuveEnRangoDeCaza(b);
    }

    public void aumentarVision(){
        vivacidad.aumentarVision();
    }

    public void reiniciarVision(){
        vivacidad.reiniciarVision();
    }

    public boolean esPresa() {
        return estadoFantasma.isPresa();
    }

 
    @Override
    public void update(Observable o, Object arg) {
        this.convertirEnPresa();
        iniciarTemporizador(Escenario.tiempoFantasmaPresa);
    }

    public String mostrarSentido(){
        ElemEscenario posicionActual = this.getPosicion();
        ElemEscenario posicionAnterior = this.getPosicionAnterior();
        if (posicionActual.getX() == posicionAnterior.getX() && posicionActual.getY()-1 == posicionAnterior.getY() ) {
            return Constantes.ABAJO_LC;
        }
        if (posicionActual.getX() == posicionAnterior.getX() && posicionActual.getY()+1 == posicionAnterior.getY()) {
            return Constantes.ARRIBA_LC;
        }
        if (posicionActual.getY() == posicionAnterior.getY() && posicionActual.getX()+1 == posicionAnterior.getX()) {
            return Constantes.IZQUIERDA_LC;
        }
        if (posicionActual.getY() == posicionAnterior.getY() && posicionActual.getX()-1 == posicionAnterior.getX()) {
            return Constantes.DERECHA_LC;
        }
        return "";
    }

}
